<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //     async 可以作用在任何的方法前, 返回值是一个promise对象;
        //     函数内部return的返回值, 会成为then回调函数的参数
        //     如果函数内部出现错误, 会被then的第二个参数或者catch捕获到 await
        //     只能在async修饰下的方法中出现, 普通函数内部直接写会报错  : await is only valid in async function 正常情况下 await后面跟的是一个 promise对象, 返回该对象的结果
        //     如果await后面不是promise, 直接返回对应的值await会阻塞代码执行是generator和promise的语法糖感觉像是在写同步代码一样
        let fn0 = async () => {

        };
        let arr = [];
        arr.map(async (item, index) => { });
        /*    async function fn1(){
        //        throw new Error("手动抛出错误");
                return 100
            }*/
        {
            /*        async function fn1(){
                        return await 1+1;
                    }
            
                    console.log(fn1());//100?
                    fn1().then((a)=>{
                        console.log(a)//100
                    },err=>{
                        console.log("err--->", err)
                    }).catch((cat)=>{
                        console.log("cat--->", cat)
                    })*/
        }
        {
            let p1 = () => new Promise((resolve, reject) => resolve("hello"));

            function fn() {
                p1().then(
                    res => {
                        console.log("step1_1", res);
                    }
                );
                console.log("step1_2")
            }
            fn();
        }
        {
            let p1 = () => Promise.resolve("hello");
            //        let p1 = ()=> Promise.reject("hello");
            async function fn() {
                //            let res = p1();
                let res = await p1();
                //感觉像是在写同步代码一样
                //await 智能接受resolve的结果.
                console.log("step2_1", res);
                console.log("step2_2")
            }
            fn()
        }
        {
            //        let p1 = ()=> Promise.reject("hello");
            let p1 = () => Promise.resolve("hello");
            async function fn() {
                //即使前面异步操作出现问题,但是不影响代码继续执行
                try {
                    let res = await p1();
                    console.log("step3_1", res);
                } catch (e) {//捕获到的错误 e
                    console.log("step3_2___catch", e)
                }
                return await 110;
            }
            fn().then(
                res => {
                    console.log("step3_then方法", res)
                }
            )
        }
    </script>
</body>

</html>